<?php

namespace app\http\middleware;

use Firebase\JWT\BeforeValidException;
use Firebase\JWT\JWT;
use Firebase\JWT\SignatureInvalidException;
use think\Db;
use think\facade\Request;

class checkAdminToken
{
    public function handle($request, \Closure $next)
    {
//        Request::header('user-agent');
        $token= Request::header('token')?Request::header('token'):Request::param('token');

        $request->token=$token;
        //判断token是否存在
        if ($request->token) {
            $user = $this->checkToken($request->token);          //token可用是返回解密后的token，不可用时返回false
            // 传了token，但是token过期或者其他问题的时候
            if ($user) {
                $request->user = $user['data'];
                $request->admin_id = $user['data']->id;

                //判断token是不是过期或者变动
                $info=Db::table('admin')->where([
                    'id'=>$user['data']->id,
                    'account'=>$user['data']->account,
                    'password'=> $user['data']->password
                ])->find();

                if($info){
                    header('Content-Type:application/json; charset=utf-8');
                    return $next($request);
                }else{
                    header('Content-Type:application/json; charset=utf-8');
                    die(json_encode(toResful(3+00,  '', 'token不正确，请重新登录')));
                }

//                $request->role = $user['data']->role;
            } else {
                header('Content-Type:application/json; charset=utf-8');
                die(json_encode(toResful(300, '', 'token不正确，请重新登录')));
            }
        } else {
            header('Content-Type:application/json; charset=utf-8');
            die(json_encode(toResful(300, '', '缺少token参数')));
        }
    }


    //创建一个token
    public static function issueToken($data)
    {
        $key = 'hello-school-admin-key'; //key
        $time = time(); //当前时间
        $token = [
            'iss' => 'http://api.hello.cn', //签发者 可选
//        'aud' => 'http://www.helloweba.net', //接收该JWT的一方，可选
            'iat' => $time, //签发时间
            'nbf' => $time, //(Not Before)：某个时间点后才能访问，比如设置time+30，表示当前时间30秒后才能使用
            'exp' => $time + 7200 * 12 * 365, //过期时间,一年过期时间
            'data' => $data
        ];
        return JWT::encode($token, $key); //输出Token
//     JWT::encode
    }


    //解密token
    private function checkToken($token)
    {
        $key = 'hello-school-admin-key'; //key

        $jwt = $token; //签发的Token
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            return $arr;
        } catch (SignatureInvalidException $e) {  //签名不正确
//        return $e->getMessage();
            //          die(toResful(300,'','token不正确，请重新登录'));
            return false;
        } catch (BeforeValidException $e) {  // 签名在某个时间点之后才能用
//        return toResful(300,'','token还未生效');
//        return $e->getMessage();
//            die(toResful(300,'','token还未生效'));
            return false;
        } catch (\Firebase\JWT\ExpiredException $e) {  // token过期
//        return $e->getMessage();
//        die(toResful(300,'','token过期，请重新登录'));
            return false;
        } catch (Exception $e) {  //其他错误
//        return $e->getMessage();
//            die(toResful(300,'','token错误'));
//        return toResful(300,'','token错误');
            return false;
        }
        //Firebase定义了多个 throw new，我们可以捕获多个catch来定义问题，catch加入自己的业务，比如token过期可以用当前Token刷新一个新Token
    }


    //根据token，返回用户的信息
    public static function getUserInfo($token)
    {
        $key = 'hello-school-admin-key'; //key

        $jwt = $token; //签发的Token
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            return $arr;
        } catch (SignatureInvalidException $e) {  //签名不正确
            die(json_encode(toResful(300, '', $e->getMessage())));
        } catch (BeforeValidException $e) {  // 签名在某个时间点之后才能用
            die(json_encode(toResful(300, '', $e->getMessage())));
        } catch (\Firebase\JWT\ExpiredException $e) {  // token过期
            die(json_encode(toResful(300, '', $e->getMessage())));
        } catch (Exception $e) {  //其他错误
            die(json_encode(toResful(300, '', $e->getMessage())));
        }
    }


}
